import {defineStore} from 'pinia';
import UserApi from '../api/user.js'
import {ContactsItem, GroupItem} from '../models/chat_model.ts';


// 定义 state 类型
interface ContactStoreState {
    groups: GroupItem[];
    friends: ContactsItem[];
    blacklist: string[]; //黑名单列表
    applyList: any[]; //好友申请列表
}

// 定义一个 name 为‘blogStore’的 store
export const useContactStore = defineStore('contactStore', {
    // 第三方插件的持久化配置
    // persist: {
    //     enabled: true,
    //     strategies: [{
    //         storage: sessionStorage
    //     }]
    // },
    state: (): ContactStoreState => {
        return {
            friends: [], //好友列表
            groups: [], // 群组列表数据
            blacklist: [], // 黑名单 ID 列表数据
            applyList: [] // 申请好友列表
        };
    },
    getters: {
        /**
         * 返回联系人列表（即好友列表）
         * @param state
         */
        getContactList(state): ContactsItem[] {
            return state.friends || [];
        },
        /**
         * 返回群组列表
         * @param state
         */
        getGroupList(state): GroupItem[] {
            return state.groups;
        },
        /**
         * 返回黑名单的uid
         * @param state
         */
        getBlacklist(state): string[] {
            // 返回 id
            return state.blacklist;
        },
        /**
         * 返回好友list的uid
         * @param state
         */
        getFriendsIds(state): string[] {
            // 返回 id
            return state.friends?.map(e => e.userId) || [];
        },
        /**
         * 返回申请好友list
         * @param state
         */
        getApplyList(state): any[] {
            return state.applyList;
        }
    },
    actions: {
        /**
         * 刷新联系人列表和群组列表
         */
        async refreshContactsGroups() {
            console.debug("refreshContacts ...")
            let resp1 = await UserApi.findContactList();

            this.friends = resp1.data.friends;
            this.blacklist = resp1.data.blackIds;

            console.debug("refreshChatGroups ...")
            let resp2 = await UserApi.findChatGroupList();
            this.groups = resp2.data;
        }

        /**
         * 刷新申请好友list
         */
        , async refreshApplyList() {
            console.debug("refreshChatGroups ...")
            let resp = await UserApi.findApplyList();
            this.applyList = resp.data;
        }

        /**
         * 根据Id，查询chatGroup
         * @param userId
         * @returns {Promise<*>}
         */
        , getGroupByRelId(relId: string): GroupItem | undefined {
            if (!relId) {
                new Error("relId不能为空");
            }
            return this.groups.find(it => {
                return String(it.relId) === String(relId)
            });
        }
        /**
         * 根据Id，查询contact
         * @param userId
         * @returns {Promise<*>}
         */
        , getContactByRelId(relId: string): ContactsItem | undefined {
            if (!relId) {
                new Error("relId不能为空");
            }
            return this.friends.find(it => {
                return String(it.relId) === String(relId)
            });
        }
        /**
         * 根据UserId，查询contact
         * @param userId
         * @returns {Promise<*>}
         */
        , getContactByUserId(userId: string): ContactsItem | undefined {
            if (!userId) {
                new Error("userId不能为空");
            }
            return this.friends.find(it => {
                return String(it.userId) === String(userId)
            });
        }

        /**
         * 查询聊天人的信息
         * @param chatId
         * @param peerUserId
         * @param isGroup
         */
        ,async getChatter(chatId:string, isGroup:boolean,peerUserId:string=""):Promise<ContactsItem|GroupItem>{
            //对方聊天人的信息
            let chatter;
            if (isGroup) {
                chatter = this.getGroupByRelId(chatId);
            } else {
                chatter = this.getContactByRelId(chatId);
            }
            if (!chatter && !isGroup) { //假设允许非好友聊天：这种是chatter还不是好友的场景
                let resp = await UserApi.searchContact(peerUserId, "direct");
                console.log("searchContact chatter = ", resp.data);
                if (resp.data.length > 0) {
                    chatter = resp.data[0];
                } else {
                    throw new Error(`允许非好友聊天下，找不到此聊天用户[${peerUserId}]`);
                }
            }
            return chatter;
        }
    }
});